
/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    s3c2440_iis.c
 * @brief   ASOC框架下的platform部分，对s3c2440控制芯片的iis接口进行设置，
 *          参考sound\soc\samsung\s3c24xx-i2s.c
 *
 * @note    核心结构体snd_soc_dai_driver
 * @author  K
 * @version 0.0.1
 * @date    2021-08-07
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-08-07   | v0.0.1    | Kcode   | s3c2440控制芯片的iis接口的设置
 * -----------------------------------------------------------------------------
 ******************************************************************************/

/*!
 * 在控制芯片上iis的具体操作函数信息
 */
static const struct snd_soc_dai_ops s3c2440_i2s_dai_ops = {
};

/*!
 * 在控制芯片上指定编解码芯片支持的属性
 */
static struct snd_soc_dai_driver s3c2440_iis_dai = {
	.playback = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = S3C24XX_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
	.capture = {
		.channels_min = 2,
		.channels_max = 2,
		.rates = S3C24XX_I2S_RATES,
		.formats = SNDRV_PCM_FMTBIT_S8 | SNDRV_PCM_FMTBIT_S16_LE,},
	.ops = &s3c2440_i2s_dai_ops,
};

/*!
 * @brief 关闭设备的函数，必须得有，否则程序编译报错
 * @return void
 */
static void s3c2440_iis_dev_release(struct device *dev)
{}

/*!
 * 分配注册一个名为s3c2440_iis_dev的平台设备
 */
static struct platform_device s3c2440_iis_dev = {
    .name    = "s3c2440-iis",
    .id      = -1,
    .device  = {
        .release = s3c2440_iis_dev_release,
    },
};

/*!
 * @brief  根据名字，连接到对应的平台驱动与设备时所调用的函数
 * @return int
 */
static int s3c2440_iis_probe(struct platform_device *pdev)
{    
    return snd_soc_register_dai(&pdev->dev, &s3c2440_iis_dai);
}

/*!
 * @brief 关闭平台驱动的函数，必须得有，否则程序编译报错
 * @return int
 */
static int s3c2440_iis_remove(struct platform_device *pdev)
{
    return snd_soc_unregister_dai(&pdev->dev);
}

/*!
 * 分配注册一个名为s3c2440_iis_dev的平台驱动
 */
struct platform_driver s3c2440_iis_drv = {
    .probe   = s3c2440_iis_probe,
    .remove  = s3c2440_iis_remove,
    .driver  = {
        .name = "s3c2440-iis",
    },
};

/*!
* @brief 入口函数
* @return int 0：注册成功，1：注册失败
*/
static int s3c2440_iis_init(void)
{
    int ret = 0;

    ret = platform_device_register(&s3c2440_iis_dev);
    if (ret) {
        printk("Can not register platform s3c2440_iis_dev!\n");
        goto fail;
    }

    ret = platform_driver_register(&s3c2440_iis_drv);
    if (ret) {
        printk("Can not register platform s3c2440_iis_drv!\n");
        platform_device_unregister(&s3c2440_iis_dev);
        goto fail;
    }

fail:    
    return ret;
}

/*!
 * @brief 出口函数
 * @return int，
 */
static void s3c2440_iis_exit(void)
{
    platform_driver_unregister(&s3c2440_iis_drv);
    platform_device_unregister(&s3c2440_iis_dev);
}
 
 /* 修饰 */
 module_init(s3c2440_iis_init);
 module_exit(s3c2440_iis_exit);
 
 /* 协议 */
 MODULE_LICENSE("GPL");


